[RoarCTF 2019]Easy Calc 1
进来就是一个普通的计算器, 输入表达式给出结果,先看一波源代码


被设了WAF, 咱也不知道是防的啥, 接着看.
请求参数被发往calc.php
, 我们直接访问一下看看:

源码直接显示出来了, 可以看到有很多过滤, 很多字符都被列入了黑名单. 先看看能不能得到当前的文件绝对路径

网页直接Forbidden
了, 经过测试,
只要num
的参数里含除数字以外的字符就会如此,
这应该就是之前说的WAF了, 不绕过这个WAF后面的操作都无法进行下去.
但是要绕过这个漏洞,
首先要知道php在解析提交的参数名和其对应的值时都做了什么
PHP需要将所有参数名转换为有效键名(比如在$_REQUEST变量里的关联数组里, 有所有提交的参数名和值)
所以
php
至少会干两件事1.删除某些字符
2.将某些字符转换为下划线
_
以下为一些本地测试结果:
- 位于提交的参数前面的
[空格]
、%20
或+
会被删除, 比如提交param=1& param2=2(或param=1&++param2=2)
, 最终在$_REQUEST
里是("param1"=>"1","param2"=>"2")
- 位于提交的参数前面的
.
会被替换成_
, 提交param=1&..param2=2
, 最终在$_REQUEST
里是("param1"=>"1","__param2"=>"2")
- 位于参数名中间、末尾,无论是
[空格]
、+
、%20
还是.
都会被替换成_
这个WAF我们可以采用在num前面加个空格方式绕过, 构造payload:
1 | calc.php? num=var_dump(scandir(chr(47))) |
scandir()
可以列出根目录下的文件,
但是/
被过滤了,
所以用chr()
函数,采用ASCII
码的方式绕过

根目录下有个f1agg
,
想必就是我们要找的flag了.
故技重施, 用chr()
函数拼出路径,
再用file_get_contents()
(也可以用highlight_file()
)获取里面的内容,
payload:
1 | calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) |
